package com.xf.system.utils.email;

import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.util.List;

/**
 * @author xiefengf
 * 发送邮件
 */
@Slf4j
@Service
public class EmailService {

    static {
        // 解决邮件发送时中文附件名乱码问题
        System.getProperties().setProperty("mail.mime.splitlongparameters", "false");
    }

    @Value("${spring.mail.username}")
    private String sendUsername;

    @Resource
    private JavaMailSender javaMailSender;


    /**
     * 发送邮件
     * @param subject             邮件主题
     * @param contentText         邮件内容
     * @param receiveEmailList 收件邮箱集合
     */
    public void sendEmail(String subject,String contentText,List<String> receiveEmailList) {
        // 将接收到的电子邮件列表（假设是一个List<String>类型）转换为字符串数组
        String[] emailArray = receiveEmailList.toArray(new String[0]);
        // 将字符串数组转换为JSON字符串，这通常用于日志记录或数据传输
        String emailStr = JSON.toJSONString(emailArray);
        try {
            // 使用JavaMailSender创建一个MimeMessage对象，用于构建电子邮件
            MimeMessage mimeMessage = javaMailSender.createMimeMessage();
            // 创建一个MimeMessageHelper对象，它提供了设置邮件属性的便捷方法、第二个参数为true表示邮件内容将使用multipart/mixed模式，支持附件、第三个参数设置邮件内容的字符编码为UTF-8
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
            // 设置发件人邮箱地址
            mimeMessageHelper.setFrom(sendUsername);
            // 设置收件人邮箱地址数组
            mimeMessageHelper.setTo(emailArray);
            // 设置邮件主题
            mimeMessageHelper.setSubject(subject);
            // 设置邮件正文内容
            mimeMessageHelper.setText(contentText);
            // 发送邮件
            javaMailSender.send(mimeMessage);
            // 记录日志，表示邮件发送完成，并包含相关信息如发送时间、发件人、收件人、邮件主题和内容
            log.info("{} -> 邮件发送完成，发件邮箱:{}，收件邮箱：{}，邮件主题:{}，邮件内容：{}", DateUtil.now(), sendUsername, emailStr, subject, contentText);
        } catch (Exception e) {
            // 捕获异常并记录日志，表示邮件发送失败，并包含相关信息如发送时间、发件人、收件人和异常信息
            log.error("{} -> 邮件发送异常，发件邮箱:{}，收件邮箱：{}", DateUtil.now(), sendUsername, emailStr, e);
        }
    }

    /**
     * 发送邮件 - 带附件
     * @param subject             邮件主题
     * @param contentText         邮件内容
     * @param receiveEmailList 收件邮箱集合
     * @param fileList            附件集合
     */
    public void sendEmail(String subject, String contentText,List<String> receiveEmailList,List<File> fileList) {
        // 将接收到的电子邮件列表（假设是一个List<String>类型）转换为字符串数组
        String[] emailArray = receiveEmailList.toArray(new String[0]);
        // 将字符串数组转换为JSON字符串，通常用于日志记录或调试目的
        String emailStr = JSON.toJSONString(emailArray);
        try {
            // 创建一个MimeMessage对象，这是JavaMail API中用于表示电子邮件的类
            MimeMessage mimeMessage = javaMailSender.createMimeMessage();
            // 创建一个MimeMessageHelper对象，它提供了设置邮件属性的便捷方法、第二个参数为true表示邮件内容将使用multipart/mixed模式，支持附件、第三个参数设置邮件内容的字符编码为UTF-8
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
            // 设置邮件的发件人地址
            mimeMessageHelper.setFrom(sendUsername);
            // 设置邮件的收件人地址数组
            mimeMessageHelper.setTo(emailArray);
            // 设置邮件的主题
            mimeMessageHelper.setSubject(subject);
            // 设置邮件的正文内容
            mimeMessageHelper.setText(contentText);
            // 添加一个附件到邮件中，fileName是附件的文件名，file是附件的文件内容（通常是一个File、InputStream或byte[]）
            // 添加附件（多个）
            if (fileList != null && fileList.size() > 0) {
                for (File file : fileList) {
                    mimeMessageHelper.addAttachment(file.getName(), file);
                }
            }
            // 发送构建好的MimeMessage对象
            javaMailSender.send(mimeMessage);
            // 记录日志信息，表示邮件发送完成，并包含发送时间、发件人、收件人（以JSON字符串形式）、邮件主题和内容
            log.info("{} -> 邮件发送完成，发件邮箱:{}，收件邮箱：{}，邮件主题:{}，邮件内容：{}", DateUtil.now(), sendUsername, emailStr, subject, contentText);
        } catch (Exception e) {
            // 捕获发送邮件过程中可能发生的任何异常
            // 记录错误日志信息，包括发送时间、发件人、收件人（以JSON字符串形式）和异常信息
            log.error("{} -> 邮件发送异常，发件邮箱:{}，收件邮箱：{}", DateUtil.now(), sendUsername, emailStr, e);
        }
    }




//    @Resource
//    private EmailProperties emailProperties;
//
//    private final EmailProperties.MailConfig mailConfig = emailProperties.getMailConfig();;
//
//    private final EmailProperties.MailText mailText = emailProperties.getMailText();;

// 发送文本邮件 - 普通mail的发送方式如下代码，但是这里使用的是apache的commons-email库
//    public void sendTextEmail(String[] toMails, String subject, String content, EmailAttachment attachment) {
//        // 断言收件人列表不为空，必须包含至少一个元素
//        Assert.notEmpty(toMails, "[断言失败] - 收件人不能为空：它必须包含至少一个元素");
//        // 给出默认主题和默认内容
//        if (subject == null) {
//            subject = mailText.getSubject();
//        }
//        if (content == null) {
//            content = mailText.getContent();
//        }
//        // 记录日志，表示开始发送邮件，并显示主题和收件人列表（用逗号分隔）
//        log.info("开始发送邮件 [{}] to {}", subject, StringUtils.join(toMails, ","));
//        try {
//            // 创建一个MultiPartEmail对象，用于发送支持附件的邮件
//            MultiPartEmail email = new MultiPartEmail();
//            // 设置SMTP服务器的主机名
//            email.setHostName(mailConfig.getSmtpHost());
//            // 设置SMTP服务器的端口号
//            email.setSmtpPort(mailConfig.getSmtpPort());
//            // 如果配置了SMTP认证，则设置用户名和密码
//            if (mailConfig.getSmtpAuth()) {
//                email.setAuthentication(mailConfig.getSmtpUsername(), mailConfig.getSmtpPassword());
//            }
//            // 设置不使用TLS加密（通常用于非安全连接）
//            email.setStartTLSEnabled(false);
//            // 根据配置设置是否在连接时启用SSL加密
//            email.setSSLOnConnect(mailConfig.getSmtpSslEnabled());
//            // 设置发件人的邮箱地址、显示名称和字符集
//            email.setFrom(mailConfig.getSmtpFromMail(), mailConfig.getSmtpFromUserName(), "UTF-8");
//            // 添加收件人邮箱地址列表
//            email.addTo(toMails);
//            // 设置邮件的主题
//            email.setSubject(subject);
//            // 设置邮件的字符集为UTF-8
//            email.setCharset("UTF-8");
//            // 设置邮件的正文内容
//            email.setMsg(content);
//            // 如果提供了附件，则将附件添加到邮件中
//            if (attachment != null) {
//                email.attach(attachment);
//            }
//            // 发送邮件
//            email.send();
//            // 记录日志，表示邮件发送成功，并显示主题和收件人列表（用逗号分隔）
//            log.info("发送邮件成功,{},{}", subject, StringUtils.join(toMails, ","));
//        } catch (Exception e) {
//            String recipients = StringUtils.join(toMails, ",");
//            log.error("[发送邮件失败] email={} :{}", recipients, e.getMessage());
//            log.error("[发送邮件失败] email={} :{}", recipients, e);
//        }
//    }

//    @Component
//    @ConfigurationProperties(prefix = com.xf.email.EmailProperties.PREFIX)
//    public class EmailProperties {
//
//        /**
//         * 邮件配置前缀
//         */
//        public static final String PREFIX = "email";
//
//        /**
//         * 邮件配置
//         */
//        private com.xf.email.EmailProperties.MailConfig mailConfig;
//
//        /**
//         * 邮件文本配置
//         */
//        private com.xf.email.EmailProperties.MailText mailText;
//
//        public com.xf.email.EmailProperties.MailConfig getMailConfig() {
//            return mailConfig;
//        }
//
//        public void setMailConfig(com.xf.email.EmailProperties.MailConfig mailConfig) {
//            this.mailConfig = mailConfig;
//        }
//
//        public com.xf.email.EmailProperties.MailText getMailText() {
//            return mailText;
//        }
//
//        public void setMailText(com.xf.email.EmailProperties.MailText mailText) {
//            this.mailText = mailText;
//        }
//
//        /**
//         * 邮件配置类
//         */
//        public static class MailConfig {
//            // smtp服务器地址
//            private String smtpHost;
//            // smtp端口
//            private int smtpPort;
//            // smtp用户名
//            private String smtpUsername;
//            // smtp密码
//            private String smtpPassword;
//            // 是否启用SSL加密
//            private Boolean smtpSslEnabled;
//            // 发件人邮箱
//            private String smtpFromMail;
//            // 发件人名称
//            private String smtpFromUserName;
//            // 是否启用认证
//            private Boolean smtpAuth;
//
//            public String getSmtpHost() {
//                return smtpHost;
//            }
//
//            public void setSmtpHost(String smtpHost) {
//                this.smtpHost = smtpHost;
//            }
//
//            public int getSmtpPort() {
//                return smtpPort;
//            }
//
//            public void setSmtpPort(int smtpPort) {
//                this.smtpPort = smtpPort;
//            }
//
//            public String getSmtpUsername() {
//                return smtpUsername;
//            }
//
//            public void setSmtpUsername(String smtpUsername) {
//                this.smtpUsername = smtpUsername;
//            }
//
//            public String getSmtpPassword() {
//                return smtpPassword;
//            }
//
//            public void setSmtpPassword(String smtpPassword) {
//                this.smtpPassword = smtpPassword;
//            }
//
//            public Boolean getSmtpSslEnabled() {
//                return smtpSslEnabled;
//            }
//
//            public void setSmtpSslEnabled(Boolean smtpSslEnabled) {
//                this.smtpSslEnabled = smtpSslEnabled;
//            }
//
//            public String getSmtpFromMail() {
//                return smtpFromMail;
//            }
//
//            public void setSmtpFromMail(String smtpFromMail) {
//                this.smtpFromMail = smtpFromMail;
//            }
//
//            public String getSmtpFromUserName() {
//                return smtpFromUserName;
//            }
//
//            public void setSmtpFromUserName(String smtpFromUserName) {
//                this.smtpFromUserName = smtpFromUserName;
//            }
//
//            public Boolean getSmtpAuth() {
//                return smtpAuth;
//            }
//
//            public void setSmtpAuth(Boolean smtpAuth) {
//                this.smtpAuth = smtpAuth;
//            }
//        }
//
//        /**
//         * 邮件文本配置类
//         */
//        public static class MailText {
//            // 警告邮件标题
//            private String subject;
//            // 邮件内容模板
//            private String content;
//
//            public String getSubject() {
//                return subject;
//            }
//
//            public void setSubject(String subject) {
//                this.subject = subject;
//            }
//
//            public String getContent() {
//                return content;
//            }
//
//            public void setContent(String content) {
//                this.content = content;
//            }
//        }
//    }


}
